package arithmetic;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

/**
 * 描述
 * 按照指定规则对输入的字符串进行处理。
 *
 * 详细描述：
 *
 * 第一步：将输入的两个字符串str1和str2进行前后合并。如给定字符串 "dec" 和字符串 "fab" ， 合并后生成的字符串为 "decfab"
 *
 * 第二步：对合并后的字符串进行排序，要求为：下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串“decfab”，分别对下标为偶数的字符'd'、'c'、'a'和下标为奇数的字符'e'、'f'、'b'进行排序（生成 'a'、'c'、'd' 和 'b' 、'e' 、'f'），再依次分别放回原串中的偶数位和奇数位，新字符串变为“abcedf”
 *
 * 第三步：对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符，需要进行转换操作。
 * 转换规则如下：
 * 对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序，然后再转换成对应的十六进制大写字符（注：字符 a~f 的十六进制对应十进制的10~15，大写同理）。
 * 如字符 '4'，其二进制为 0100 ，则翻转后为 0010 ，也就是 2 。转换后的字符为 '2'。
 * 如字符 ‘7’，其二进制为 0111 ，则翻转后为 1110 ，对应的十进制是14，转换为十六进制的大写字母为 'E'。
 * 如字符 'C'，代表的十进制是 12 ，其二进制为 1100 ，则翻转后为 0011，也就是3。转换后的字符是 '3'。
 * 根据这个转换规则，由第二步生成的字符串 “abcedf” 转换后会生成字符串 "5D37BF"。
 *
 *
 * 数据范围：输入的字符串长度满足1≤n≤100
 *
 * 输入描述：
 * 样例输入两个字符串，用空格隔开。
 *
 * 输出描述：
 * 输出转化后的结果。
 *
 * 示例1
 * 输入：
 * dec fab
 * 复制
 * 输出：
 * 5D37BF
 * 复制
 * 示例2
 * 输入：
 * ab CD
 * 复制
 * 输出：
 * 3B5D
 * 复制
 * 说明：
 * 合并后为abCD，按奇数位和偶数位排序后是CDab（请注意要按ascii码进行排序，所以C在a前面，D在b前面），转换后为3B5D
 * 示例3
 * 输入：
 * 123 15
 * 复制
 * 输出：
 * 88C4A
 */
public class TestHW30 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别

        // while (in.hasNextInt()) { // 注意 while 处理多个 case
        //     int a = in.nextInt();
        //     int b = in.nextInt();
        //     System.out.println(a + b);
        // }
        String str = "";
        while (in.hasNextLine()) {
            str = in.nextLine();
        }
        if (str.isEmpty())return;
        //合并
        str = str.replaceAll(" ", "");
        // System.out.println(str);
        //获取下标分别为奇数和偶数的字符
        // String oddString = "";
        // String evenString = "";
        ArrayList<Character> oddList = new ArrayList<Character>();
        ArrayList<Character> evenList = new ArrayList<Character>();
        int index = 0;
        while (index < str.length()) {
            char ch = str.charAt(index);
            if (index % 2 == 1) {
                oddList.add(ch);
            } else {
                evenList.add(ch);
            }
            index++;
        }
        //排序
        oddList.sort(Comparator.comparing(i -> i));
        evenList.sort(Comparator.comparing(i -> i));
        // System.out.println(oddList.toString() + "\n" + evenList.toString());
        //组成新的字符串
        StringBuffer stringBuffer = getNewString(oddList, evenList);
        // System.out.println(stringBuffer);
        //------------------------
        // StringBuffer strBinary = new StringBuffer();
        // char ch = binaryNum(binary(7,strBinary,3));
        // System.out.println("---"+ch);
        //------------------------------
        StringBuffer result = conversion(stringBuffer);
        System.out.println(result.toString());

    }

    //第三步转换
    public static StringBuffer conversion(StringBuffer stringBuffer ) {
        StringBuffer conversionStr = new StringBuffer();
        int index = 0;
        while (index < stringBuffer.length()) {
            char ch = stringBuffer.charAt(index);
            // System.out.print(ch+" ");
            StringBuffer strBinary = new StringBuffer();
            if (ch >= 48 && ch <= 57) {
                int num = Integer.parseInt(ch + "");
                strBinary = binary(num, strBinary, 3);
                ch = binaryNum(strBinary);
            }else if (ch >= 65 && ch <= 70) {
                //注意char类型参与运算时，类型会发生变更
                int num = Integer.parseInt((char)(ch - 17) + "") + 10;
                strBinary = binary(num, strBinary, 3);
                ch = binaryNum(strBinary);
            }else if (ch >= 97 && ch <= 102) {
                int num = Integer.parseInt((char)(ch - 49) + "") + 10;
                strBinary = binary(num, strBinary, 3);
                ch = binaryNum(strBinary);
            }
            conversionStr.append(ch);
            index++;
        }

        return conversionStr;
    }


    public static StringBuffer getNewString(ArrayList<Character> oddList,
                                            ArrayList<Character> evenList) {
        StringBuffer newString = new StringBuffer();
        boolean f1 = evenList.size() > oddList.size();
        for (int i = 0; i < evenList.size(); i++) {
            if (f1 && i == evenList.size() - 1) {
                newString.append(evenList.get(i));
            } else {
                newString.append(evenList.get(i)).append(oddList.get(i));
            }
        }
        return newString;
    }

    //将数字使用二进制表示，分析知最大需要表示的数为15，即1111
    public static StringBuffer binary(int num, StringBuffer strBinary, int index) {
        if (index < 0) {
            return strBinary.reverse();
        }
        int binaryNum = (int)Math.pow(2, index);
        if (binaryNum > num) {
            strBinary.append("0");
        } else {
            strBinary.append("1");
            num -= binaryNum;
        }
        index--;
        return binary(num, strBinary, index);
    }
    //反转后的数据 65~90 48~57
    public static char binaryNum(StringBuffer strBinary) {
        char ch = ' ';
        // System.out.println(strBinary.charAt(0));
        int index0 = Integer.parseInt(strBinary.charAt(0) + "");
        int index1 = Integer.parseInt(strBinary.charAt(1) + "");
        int index2 = Integer.parseInt(strBinary.charAt(2) + "");
        int index3 = Integer.parseInt(strBinary.charAt(3) + "");
        int num = index0 * (int)Math.pow(2,
                3) + index1 * (int)Math.pow(2,
                2) + index2 * (int)Math.pow(2,
                1) + index3 * (int)Math.pow(2, 0);
        if (num >= 10) {
            num += 55;
        } else {
            num += 48;
        }
        ch = (char)num;
        return ch;
    }

}
